/*
 * 学习 GTK3 GUI 编程
 * 参考网站：https://www.jianshu.com/nb/14253609
 */

#include <gtk/gtk.h>

static void button1_handler(GtkWidget* widget, gpointer user_data)
{
    g_print(user_data);
    g_print("\n");
}

//创建回调函数 activate，方便下面 g_signal_connect() 调用
static void activate(GtkApplication *app, gpointer user_data) {

//    创建一个新的 GtkWindow 并将其存储在 window 指针中。窗口将有一个框架，标题栏和窗口控件取决于平台
    GtkWidget *window = gtk_application_window_new(app);
    GtkWidget *grid = gtk_grid_new();

    gtk_container_add(GTK_CONTAINER(window), grid);

//    通过 gtk_button_box_new() 函数创建一个 GtkButtonBox 布局，参数 GTK_ORIENTATION_HORIZONTAL 代表方向，这里是水平布局
//    GtkWidget *button_box = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
//    通过 gtk_button_new_with_label() 函数创建一个 GtkButton 控件，参数“按钮1”代表按钮文本字符串
    GtkWidget *button1 = gtk_button_new_with_label("按钮1");
    GtkWidget *button2 = gtk_button_new_with_label("按钮2");
    GtkWidget *button3 = gtk_button_new_with_label("按钮3");

    gtk_grid_attach(GTK_GRID(grid), button1, 0, 0, 1, 1);
    gtk_grid_attach(GTK_GRID(grid), button2, 1, 0, 1, 1);
    gtk_grid_attach(GTK_GRID(grid), button3, 0, 1, 2, 1);



//    通过 gtk_container_add() 函数将 button_box 布局添加到 window 主窗口中。gtk_container_add 函数需要一个 GtkContainer 作为
//    参数，这里使用 GTK_CONTAINER 宏将 window 强制转型为 GtkContainer
//    gtk_container_add(GTK_CONTAINER(window), button_box);
//    gtk_container_add(GTK_CONTAINER(button_box), button1);

    g_signal_connect(button1, "clicked", G_CALLBACK(button1_handler), "按钮 1 点击");
    g_signal_connect(button2, "clicked", G_CALLBACK(button1_handler), "按钮 2 点击");
    g_signal_connect(button3, "clicked", G_CALLBACK(button1_handler), "按钮 3 点击");


    gtk_window_set_title(GTK_WINDOW(window), "hello GTK");
    gtk_window_set_default_size(GTK_WINDOW(window), 500, 400);
    gtk_widget_show_all(window);
}

int main(int argc, char **argv) {

//     创建 GtkApplication 这个类的一个实例，启动程序需要此实例
    GtkApplication *app = gtk_application_new("org.lu.firstAPP", G_APPLICATION_FLAGS_NONE);
//    将 GtkApplication 实例 app 连接到信号 activate
    g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
//    g_application_run() 函数用于启动应用程序，当退出应用程序时 g_application_run() 将返回一个保存在名为 status 的整数中的整数
    int status = g_application_run(G_APPLICATION(app), argc, argv);
//    当退出应用程序时 g_object_unref() 将 GtkApplication 对象从内存中释放出来
    g_object_unref(app);
    return status;

}